/*
 * Strahlentherapie.cc
 *
 *  Created on: Oct 1, 2010
 *      Author: pwagner
 *
 *  Erlaeuterung zum GDML-Export:
 *  Zur Nutzung des GDML-Exports muss bei Geant4 Installation die
 *  GDML-Unterstuetzung aktiviert gewesen sein. Wenn Geant4 mit
 *  GDML-Unterstuetzung installiert wurde, kann der auskommentierte Code
 *  unter 'GDML_COMMENT1' und 'GDML_COMMENT2' wieder einkommentiert (sagt man
 *  das?) werden.
 */

#include "G4RunManager.hh"
#include "G4UItcsh.hh"
#include "G4UImanager.hh"
#include "G4UIExecutive.hh"
#include "G4VisManager.hh"
#include "G4VisExecutive.hh"

#include "StrahlentherapieUISession.hh"
#include "StrahlentherapieDetectorConstruction.hh"
#include "StrahlentherapiePhysicsList.hh"
#include "StrahlentherapiePrimaryGeneratorAction.hh"
#include "StrahlentherapieRunAction.hh"

// Benoetigt fuer Ausgabe der DetectorConstruction als GDML-Datei.
// Zur Nutzung muss bei Geant4 Installation die GDML-Unterstuetzung
// aktiviert gewesen sein.
/*
// GDML_COMMENT1
#include "G4GDMLParser.hh"
#include "G4GDMLWriteStructure.hh"
#include "G4GDMLReadStructure.hh"
*/

#include <ctime>

int main(int argc,char **argv)
{  
	int start = clock();

	/* Wenn ein Argument bei Programmaufruf mitgegeben wurde, wird die
	 * DetectorConstruction in eine GDML-Datei geschrieben. Der Name
	 * der GDML-Datei ist gleich dem uebergebenen Argument.
	 *
	 * Zur Nutzung muss bei Geant4 Installation die GDML-Unterstuetzung
	 * aktiviert gewesen sein.
	 */
	/*
	// GDML_COMMENT2
	if (argc==2)
		{
			// Warum neu initialisieren und nicht vom Runmanager holen?
			// Siehe naechster Kommentar.
			StrahlentherapieDetectorConstruction* stdc = new StrahlentherapieDetectorConstruction();

			G4GDMLReadStructure* reader = new G4GDMLReadStructure();
			G4GDMLWriteStructure* writer = new G4GDMLWriteStructure();
			G4GDMLParser* parser = new G4GDMLParser(reader, writer);

			// Ich wollte statt 'stdc->Construct()' eigentlich vom Runmanager
			// die G4VUserDetectorConstruction holen, diese als
			// StrahlentherapieDetectorConstruction casten und dann darauf
			// die neue Methode 'GetPhysicalVolume()' aufrufen. Leider wollte
			// das Casten nicht. Daher initialisiere ich oben

			parser->Write(argv[1], stdc->Construct());

				delete reader;
				delete writer;
				delete parser;
				delete stdc;
		} */

	// construct the default run manager
	G4RunManager* runManager = new G4RunManager;

	// get the pointer to the UI manager and set verbosities
	G4UImanager* UImanager = G4UImanager::GetUIpointer();

	StrahlentherapieUISession* LogSession = new StrahlentherapieUISession();
	UImanager->SetCoutDestination(LogSession);

	// set mandatory initialization classes
	runManager->SetUserInitialization(new StrahlentherapieDetectorConstruction);
	runManager->SetUserInitialization(new StrahlentherapiePhysicsList);


	// initialize G4 kernel
	runManager->Initialize();

	// set mandatory user action class
	runManager->SetUserAction(new StrahlentherapiePrimaryGeneratorAction);
	runManager->SetUserAction(new StrahlentherapieRunAction);

#ifdef G4VIS_USE
	G4VisManager* visManager = new G4VisExecutive;
	visManager->Initialize();
#endif

	UImanager->ApplyCommand("/control/execute run.mac");
	
	((StrahlentherapiePrimaryGeneratorAction*)runManager->GetUserPrimaryGeneratorAction())->GetParticleGun()->PrintEnergyHist();

	G4cout << G4endl << "Laufzeit: " << ((float)(clock()-start))/CLOCKS_PER_SEC << " s" << G4endl;	

/*	G4UItcsh* tcsh = new G4UItcsh();
	tcsh->SetPrompt("%s>"); 
	
	G4UIsession * session = new G4UIterminal(tcsh);
	session->SessionStart();
	
	delete session;
*/

#ifdef G4VIS_USE
	delete visManager;
#endif

	// job termination
	delete runManager;
	// session termination
	delete LogSession;
	return 0;
}

